#include "soft_iic_drv.h"


void SendACK(void);
void SendNAK(void);

//延时 函数
static void I2C_delay(void)
{
	u8 t=10;
	while(t--);
}

//配置gpio 输入输出
static void sda_cfg_output(void)
{
    gpio_output_cfg(SOFT_SDA_PORT, SOFT_SDA_PIN);
}

static void sda_cfg_input(void)
{
    gpio_input_cfg(SOFT_SDA_PORT, SOFT_SDA_PIN, GPIO_Pull_Up);
}


void Start(void)
{
	sda_cfg_output();
	I2C_delay();
	I2C_SDA_Set();
	I2C_delay();
	I2C_SCL_Set();
	I2C_delay();
	I2C_SDA_Clr();
	I2C_delay();
	I2C_delay();
	I2C_delay();
	I2C_SCL_Clr();
}

//========================================================================
// 函数: void SendData (char dat)
// 描述: I2C发送一个字节数据函数.
// 参数: 发送的数据.
// 返回: none.
//========================================================================
void SendData(u8 dat)
{
	u8 i;
    sda_cfg_output();

	for(i=0;i<8;i++)
	{
		I2C_SCL_Clr();//将时钟信号设置为低电平
		if(dat&0x80)//将dat的8位从最高位依次写入
		{
			I2C_SDA_Set();
        }
		else
		{
			I2C_SDA_Clr();
        }
		I2C_delay();
		I2C_SCL_Set();
		I2C_delay();
		I2C_SCL_Clr();
		dat<<=1;
  }
}

//========================================================================
// 函数: void RecvACK (void)
// 描述: I2C获取ACK函数.
// 参数: none.
// 返回: none.
// 版本: V1.0, 2020-09-15
//========================================================================
void RecvACK(void)
{
	I2C_SDA_Set();
	I2C_delay();
	I2C_SCL_Set();
	I2C_delay();
	I2C_SCL_Clr();
	I2C_delay();
}

//========================================================================
// 函数: char RecvData (void)
// 描述: I2C读取一个字节数据函数.
// 参数: none.
// 返回: 读取数据.
// 版本: V1.0, 2020-09-15
//========================================================================
char RecvData(u8 SF_Ack)
{
	u8 Rb_Cnt = 0; //读数据位计数 
	u8 RByte  = 0; //读字节
  	//I2C_SDA_Dir(0);//SDA设置为输入
    sda_cfg_input(); //SDA设置为输入  

  	for(Rb_Cnt=0; Rb_Cnt<8; Rb_Cnt++)
  	{
   	 	I2C_SCL_Clr(); //拉低时钟线   准备开始传送数据位 
    	I2C_delay();
    	I2C_SCL_Set(); //拉高时钟线
    	RByte <<= 1; //数据移位
    	if(IS_SDA_H())
  		{
      		RByte++;
    	}			
	    I2C_delay();
  	}					 
	if(!SF_Ack)    //0	不发送Ack
	{
	  SendNAK(); //发送NAck
	}
	else           //1		发送Ack
	{
	  SendACK();  //发送Ack
	}
	return RByte;
}

//========================================================================
// 函数: void SendACK (void)
// 描述: I2C发送ACK函数.
// 参数: none.
// 返回: none.
// 版本: V1.0, 2020-09-15
//========================================================================
void SendACK(void)
{
	I2C_SCL_Clr();   //拉低时钟线 
 // I2C_SDA_Dir(1);//I2C_SDA线输出
 sda_cfg_output();
  I2C_SDA_Clr();   //拉低数据线
  I2C_delay();;
  I2C_SCL_Set();   //拉高时钟线
  I2C_delay();;
  I2C_SCL_Clr();   //拉低时钟线 
}

//========================================================================
// 函数: void SendNAK (void)
// 描述: I2C发送NAK函数.
// 参数: none.
// 返回: none.
// 版本: V1.0, 2020-09-15
//========================================================================
void SendNAK(void)
{
	I2C_SCL_Clr();   //拉低时钟线 
 // I2C_SDA_Dir(1);//I2C_SDA线输出
    sda_cfg_output();

  I2C_SCL_Set();   //拉高数据线
  I2C_delay();;
  I2C_SCL_Set();   //拉高时钟线
  I2C_delay();;
  I2C_SCL_Clr();   //拉低时钟线 
}

//========================================================================
// 函数: void Stop (void)
// 描述: I2C总线停止函数.
// 参数: none.
// 返回: none.
// 版本: V1.0, 2020-09-15
//========================================================================
void Stop(void)
{
    sda_cfg_output();
	I2C_SDA_Clr();
	I2C_delay();
	I2C_delay();
	I2C_SCL_Set();
	I2C_delay();
	I2C_delay();
	I2C_delay();
	I2C_SDA_Set();
}



void soft_iic_init(void)
{
    gpio_output_cfg(SOFT_SCL_PORT, SOFT_SCL_PIN);
    gpio_output_cfg(SOFT_SDA_PORT, SOFT_SDA_PIN);
    // SC7A20_Init();
}
